package com.twb.auth.controller;

import com.twb.auth.entity.twbUser.TwbUser;
import com.twb.auth.entity.twbUser.dto.GetTwbUserByIdDto;
import com.twb.auth.entity.twbUser.dto.LockedLoginUserDto;
import com.twb.auth.entity.twbUser.dto.SearchTwbUserDto;
import com.twb.auth.entity.twbUser.vo.SaveTwbUserVo;
import com.twb.auth.entity.twbUser.vo.SearchTwbUserVo;
import com.twb.auth.entity.twbUser.vo.UpdateTwbUserByIdVo;
import com.twb.auth.service.ITwbUserService;
import com.twb.core.base.Result;
import com.twb.core.base.controller.BaseController;
import com.twb.core.base.entity.BaseLoginUser;
import com.twb.core.base.entity.TwbPageInfo;
import com.twb.core.base.entity.vo.PageVo;
import com.twb.core.cache.redis.RedisUtil;
import com.twb.core.config.TwbConfigProperties;
import com.twb.core.security.annotation.Auth;
import com.twb.core.util.Results;
import com.twb.core.util.cipher.MD5Util;
import com.twb.system.common.SystemGlobal;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/sys/twbUser")
@Api(value = "TwbUserController", tags = "用户管理接口")
public class TwbUserController extends BaseController {

	@Autowired
	ITwbUserService twbUserService;

	@Autowired
	RedisUtil redisUtil;

	@Autowired
	TwbConfigProperties twbConfigProperties;
	
	/**
	 * @Title  searchTwbUser
	 * @Description 分页查询用户
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:09:33
	 */
	@Auth(verifyURL = false)
	@GetMapping("/search")
	@ApiOperation(value = "分页查询用户")
	public Result<TwbPageInfo<SearchTwbUserDto>> searchTwbUser(SearchTwbUserVo vo) {
		TwbPageInfo<SearchTwbUserDto> result = twbUserService.searchTwbUser(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title  getTwbUserById
	 * @Description 根据ID获取用户详情
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:48:30
	 */
	@GetMapping("/getById")
	@ApiOperation(value = "根据ID获取用户详情")
	public Result<GetTwbUserByIdDto> getTwbUserById(
			@NotBlank @RequestParam @ApiParam(value = "序号", name = "id", required = true) String id) {
		GetTwbUserByIdDto dto = twbUserService.getTwbUserById(id);
		return Results.successWithData(dto);
	}

	/**
	 * @Title  saveTwbUser
	 * @Description 保存用户
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:56:36
	 */
	@PostMapping("/save")
	@ApiOperation(value = "保存用户")
	public Result<String> saveTwbUser(@RequestBody @Valid SaveTwbUserVo vo) {

		String pwd = SystemGlobal.sysConfig("password");
		if (StringUtils.isBlank(pwd)) {
			pwd = "pwd123456";
		}
		vo.setPwd(MD5Util.generate(pwd));

		boolean result = twbUserService.saveTwbUser(vo);
		if (result) {
			return Results.success("保存成功，用户密码为：【"+ pwd +"】");
		} else {
			return Results.failure("保存失败");
		}
	}

	/**
	 * @Title  updateTwbUser
	 * @Description
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午11:19:27
	 */
	@Auth(verifyURL = false)
	@PutMapping("/updateById")
	@ApiOperation(value = "更新用户")
	public Result<String> updateTwbUserById(@RequestBody @Valid UpdateTwbUserByIdVo vo) {

		boolean result = twbUserService.updateTwbUserById(vo);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title  deleteTwbUserById
	 * @Description 删除用户信息
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月27日 上午11:30:36
	 */
	@PostMapping("/delete")
	@ApiOperation(value = "删除用户信息")
	public Result<String> deleteTwbUserById(@NotBlank @RequestParam String id) {
		TwbUser record = twbUserService.getById(id);
		if (null == record) {
			return Results.failure("用户不存在");
		}
		boolean result = twbUserService.deleteTwbUserById(id);
		if (result) {
			return Results.success("删除成功");
		} else {
			return Results.failure("删除失败");
		}
	}

	/**
	 * @Title  logicDeleteTwbUserById
	 * @Description 逻辑删除用户信息
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午11:24:09
	 */
	@PostMapping("/logicBatchDeleteByIds")
	@ApiOperation(value = "逻辑删除用户信息")
	public Result<String> logicBatchDeleteByIds(@NotBlank @RequestParam String ids) {
		boolean result = twbUserService.logicDeleteTwbUserById(ids);
		if (result) {
			return Results.success("删除成功");
		} else {
			return Results.failure("删除失败");
		}
	}

	/**
	 * @Title  saveUserOrg
	 * @Class: TwbUserController.java
	 * @Description 保存用户机构
	 * @param userId
	 * @param orgIds
	 * @return
	 * @author DSY
	 * @date 2018年11月25日 下午9:04:09
	 */
	@PostMapping("/saveUserOrg")
	@ApiOperation(value = "保存用户机构")
	public Result<String> saveUserOrg(@NotBlank @RequestParam String userId, @NotBlank @RequestParam String orgIds) {
		int result = twbUserService.saveUserOrg(userId, orgIds);
		if (result > 0) {
			return Results.success("保存成功");
		} else {
			return Results.failure("保存失败");
		}
	}

	/**
	 * @Title  saveUserRole
	 * @Class: TwbUserController.java
	 * @Description 保存用户角色
	 * @param userId
	 * @param roleIds
	 * @return
	 * @author DSY
	 * @date 2018年11月25日 下午9:24:17
	 */
	@PostMapping("/saveUserRole")
	@ApiOperation(value = "保存用户角色")
	public Result<String> saveUserRole(@NotBlank @RequestParam String userId, @RequestParam String roleIds) {
		int result = twbUserService.saveUserRole(userId, roleIds);
		if (result > 0) {
			return Results.success("保存成功");
		} else {
			return Results.failure("保存失败");
		}
	}

	/**
	 * @Title  updateCurrentPwd
	 * @Description 密码重置
	 * @param userId
	 * @return
	 * @author DSY
	 * @date 2018年11月27日 上午11:30:58
	 */
	@PostMapping("/updateCurrentPwd")
	@ApiOperation(value = "用户密码重置")
	public Result<String> updateCurrentPwd(
			@NotBlank @RequestParam String userId,
			@RequestParam String newPassword) {

		String pwd = newPassword;
		if(StringUtils.isBlank(pwd)) {
			pwd = SystemGlobal.sysConfig("password");

			if (StringUtils.isBlank(pwd)) {
				pwd = "pwd123456";
			}
		}

		boolean result = twbUserService.updateCurrentPwd(userId, pwd);
		if (result) {
			return Results.success("密码重置成功，新密码：【"+ pwd +"】");
		} else {
			return Results.failure("密码重置失败");
		}
	}

	/**
	 * @Title searchUsers
	 * @Description 分页查询用户
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2020年7月14日 下午6:19:26
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchUsers")
	@ApiOperation(value = "分页查询用户")
	public Result<TwbPageInfo<SearchTwbUserDto>> searchUsers(SearchTwbUserVo vo) {
		vo.setStatus("1");
		TwbPageInfo<SearchTwbUserDto> result = twbUserService.searchTwbUser(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title searchRoleUsers
	 * @Description 分页查询角色待选择用户
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2020年7月15日 下午4:11:03
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchRoleSelectUsers")
	@ApiOperation(value = "分页查询角色待选择用户")
	public Result<TwbPageInfo<SearchTwbUserDto>> searchRoleSelectUsers(SearchTwbUserVo vo) {
		vo.setStatus("1");

		TwbPageInfo<SearchTwbUserDto> result = twbUserService.searchRoleSelectUsers(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title searchRoleUsers
	 * @Description 分页查询角色用户
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2020年7月15日 下午4:11:03
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchRoleUsers")
	@ApiOperation(value = "分页查询角色用户")
	public Result<TwbPageInfo<SearchTwbUserDto>> searchRoleUsers(SearchTwbUserVo vo) {
		vo.setStatus("1");
		TwbPageInfo<SearchTwbUserDto> result = twbUserService.searchRoleUsers(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title grantOrganization
	 * @Description 修改用户组织机构
	 * @param orgId
	 * @param userId
	 * @return
	 * @author DSY
	 * @date 2021年4月10日 下午8:23:14
	 */
	@Auth(verifyURL = false)
	@ApiOperation(value = "修改用户组织机构")
	@PostMapping("/grantOrganization")
	public Result<String> grantOrganization(
			@NotBlank @RequestParam @ApiParam(value = "组织机构ID", name = "orgId", required = true) String orgId,
			@NotBlank @RequestParam @ApiParam(value = "用户ID", name = "userId", required = true) String userId) {
		int result = twbUserService.grantOrganization(orgId, userId);
		if(result>0) {
			return Results.success("修改成功");
		}else {
			return Results.failure("修改失败");
		}
	}

	/**
	 * 不分页查询用户
	 * @param vo
	 * @return
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchUsersList")
	@ApiOperation(value = "不分页查询用户")
	public Result<List<SearchTwbUserDto>> searchUsersList(SearchTwbUserVo vo) {
		List<SearchTwbUserDto> result = twbUserService.searchUsersList(vo);
		return Results.successWithData(result);
	}
	
	/**
	 * @Title listOnlineLoginUser
	 * @Description 查询在线用户信息
	 * @author DSY
	 * @date 2022年7月26日 下午8:55:28
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchOnlineLoginUser")
	@ApiOperation(value = "查询在线用户信息")
	public Result<TwbPageInfo<BaseLoginUser>> searchOnlineLoginUser(PageVo vo) {
		TwbPageInfo<BaseLoginUser> info = new TwbPageInfo<BaseLoginUser>();
		List<BaseLoginUser> list = twbSecurityUtil.searchOnlineLoginUser(vo.getPageNum(), vo.getPageSize());
		Long count = twbSecurityUtil.countOnlineLoginUser();
		info.setList(list);
		info.setTotal(count);
		info.setPageNum(vo.getPageNum());
		info.setPageSize(vo.getPageSize());
		return Results.successWithData(info);
	}

	/**
	 * @param token
	 * @return
	 * @Title removeOnlineLoginUser
	 * @Description 删除在线用户信息
	 * @author DSY
	 * @date 2022年7月26日 下午9:19:54
	 */
	@PostMapping("/removeOnlineLoginUser")
	@ApiOperation(value = "删除在线用户信息")
	public Result<String> removeOnlineLoginUser(
			@RequestParam @NotNull(message = "登录令牌不能为空") @ApiParam(value = "token", name = "token", required = true) String token) {
		try {
			twbSecurityUtil.removeLoginUser(token);
			return Results.success("操作成功");
		} catch (Exception e) {
			return Results.failure("操作失败");
		}
	}

	/**
	 * @param token
	 * @return
	 * @Title getOnlineLoginUser
	 * @Description 获取在线用户基本信息
	 * @author DSY
	 * @date 2022年7月26日 下午9:34:51
	 */
	@Auth(verifyURL = false)
	@GetMapping("/getOnlineLoginUser")
	@ApiOperation(value = "获取在线用户基本信息")
	public Result<BaseLoginUser> getOnlineLoginUser(
			@RequestParam @NotNull(message = "登录令牌不能为空") @ApiParam(value = "token", name = "token", required = true) String token) {
		BaseLoginUser user = twbSecurityUtil.getLoginUser(token);
		return Results.successWithData(user);
	}

	/**
	 * @param token
	 * @return
	 * @Title getOnlineTwbLoginUser
	 * @Description 获取在线用户详细信息
	 * @author DSY
	 * @date 2022年7月26日 下午9:34:58
	 */
	@Auth(verifyURL = false)
	@GetMapping("/getOnlineTwbLoginUser")
	@ApiOperation(value = "获取在线用户详细信息")
	public Result<BaseLoginUser> getOnlineTwbLoginUser(
			@RequestParam @NotNull(message = "登录令牌不能为空") @ApiParam(value = "token", name = "token", required = true) String token) {
		BaseLoginUser user = twbSecurityUtil.getTwbLoginUser(token);
		return Results.successWithData(user);
	}

	/**
	 * @Title listLockedLoginUser
	 * @Description 查询锁定用户信息
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年11月1日 下午8:36:10
	 */
	@Auth(verifyURL = false)
	@GetMapping("/listLockedLoginUser")
	@ApiOperation(value = "查询锁定用户信息")
	public Result<List<LockedLoginUserDto>> listLockedLoginUser() {
		List<LockedLoginUserDto> list = new ArrayList<LockedLoginUserDto>();
		String pattern = twbConfigProperties.getCachePrefix() + ":lockUsers:*";
		Collection<String> keys = redisUtil.keys(pattern);
		for (String key : keys) {
			String loginName = key.replace(pattern.replace("*", ""), "");
			Integer loginCount = redisUtil.get(key);
			LockedLoginUserDto dto = new LockedLoginUserDto();
			dto.setLoginName(loginName);
			dto.setLoginCount(loginCount);
		}
		return Results.successWithData(list);
	}

	/**
	 * @Title unLockedLoginUser
	 * @Description 解除锁定用户信息
	 * @param loginName
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年11月1日 下午9:56:53
	 */
	@Auth(verifyURL = false)
	@GetMapping("/unLockLoginUser")
	@ApiOperation(value = "解除锁定用户信息")
	public Result<String> unLockLoginUser(String loginName) {
		boolean unlock = twbSecurityUtil.unlockLoginUser(loginName);
		if(unlock) {
			return Results.success("解除锁定成功");
		}else {
			return Results.success("解除锁定失败");
		}
	}
}
